// DOM渲染功能实现

/**
 * 将虚拟DOM渲染为真实DOM
 * @param {Object|string|number} vnode - 虚拟DOM对象、字符串或数字
 * @returns {Node} 渲染后的真实DOM节点
 */
function _render(vnode) {
  // 如果是数字类型转化为字符串
  if (typeof vnode === "number") {
    vnode = String(vnode);
  }
  // 字符串类型直接就是文本节点
  if (typeof vnode === "string") {
    // 注意：此函数需要在浏览器环境下运行，Node.js环境中没有document对象
    try {
      const textNode = document.createTextNode(vnode);
      return textNode;
    } catch (e) {
      console.warn('DOM渲染函数需要在浏览器环境下运行，当前环境不支持document对象');
      return { type: 'text', content: vnode };
    }
  }
  
  // 普通DOM元素
  try {
    const element = document.createElement(vnode.tag);
    
    // 添加属性
    if (vnode.attrs) {
      for (let key in vnode.attrs) {
        const value = vnode.attrs[key];
        element.setAttribute(key, value);
      }
    }
    
    // 处理子节点
    if (vnode.children && vnode.children.length) {
      vnode.children.forEach(child => {
        const childElement = _render(child);
        element.appendChild(childElement);
      });
    }
    
    return element;
  } catch (e) {
    console.warn('DOM渲染函数需要在浏览器环境下运行，当前环境不支持document对象');
    // 在非浏览器环境返回简化的对象结构
    return {
      type: 'element',
      tag: vnode.tag,
      attrs: vnode.attrs,
      children: vnode.children ? vnode.children.map(child => _render(child)) : []
    };
  }
}

// 测试数据
const vDom = {
  tag: 'DIV',
  attrs: {
    id: 'app'
  },
  children: [
    {
      tag: 'SPAN',
      children: [
        { tag: 'A', children: [] }
      ]
    },
    {
      tag: 'SPAN',
      children: [
        { tag: 'A', children: [] },
        { tag: 'A', children: [] }
      ]
    }
  ]
};

/**
 * 测试DOM渲染功能
 * 注意：此函数需要在浏览器环境下运行才能看到真实DOM效果
 */
function testRender() {
  console.log('DOM渲染函数需要在浏览器环境下测试');
  console.log('vDom测试数据已定义，可以在浏览器控制台中调用 _render(vDom) 进行测试');
  
  try {
    // 尝试渲染（在浏览器环境下会正常工作）
    const result = _render(vDom);
    console.log('渲染结果:', result);
  } catch (e) {
    console.log('当前环境无法渲染真实DOM，测试已跳过');
  }
  
  return vDom;
}

// 导出函数
module.exports = {
  _render,
  testRender,
  vDom
};